<template>
	<view class="edit">
		<!-- 标题输入框 -->
		<view class="title">
			<input type="text" v-model="artObj.title" placeholder="请输入标题" placeholder-class=placeholderClass>
		</view>

		<!-- 
			内容(富文本编辑器)
			show-img-size show-img-toolbar show-img-resize 是点击图片进行的一些操作
				可能弹出一些工具栏之类
			ready事件,代表富文本编辑器初始化
			focos事件,当富文本编辑器鼠标对焦触发
		-->
		<view class="content">
			<editor class="myEdit" placeholder="请输入文章内容" show-img-size show-img-toolbar show-img-resize
				@ready="onEditReady" @focus="onFocus" @statuschange="onStatusChange"></editor>
		</view>

		<view class="btnGroup">
			<u-button type="primary" :disabled="!artObj.title.length" @click="onSubmit">发表</u-button>
		</view>

		<view class="tools" v-if="toolShow">
			<!-- 工具栏标题图标 -->
			<view class="item" @click="clickHead">
				<text class="iconfont icon-zitibiaoti" :class="headShow ? 'active' : false"></text>
			</view>
			<!-- 工具栏加粗图标 -->
			<view class="item" @click="clickBold">
				<text class="iconfont icon-zitijiacu" :class="boldShow ? 'active' : false"></text>
			</view>
			<!-- 工具栏横线图标 -->
			<view class="item" @click="clickDivider"><text class="iconfont icon-fengexian"></text></view>
			<!-- 工具栏图片图标 -->
			<view class="item" @click="clickInsertImage"><text class="iconfont icon-charutupian"></text></view>
			<!-- 点击对号,让工具栏隐藏(反正对焦工具栏还显示) -->
			<view class="item" @click="toolShow = !toolShow"><text class="iconfont icon-duigou_kuai"></text></view>
		</view>
	</view>
</template>

<script>
	import {
		getImgSrc,
		getProvince
	} from "../../utils/tools.js";

	const db = uniCloud.database();
	export default {
		data() {
			return {
				toolShow: false,
				headShow: false, // 设置标题图标是否高亮 
				boldShow: false, // 设置加粗图标是否高亮
				artObj: { // 编辑的表单
					title: "",
					content: "",
					description: "",
					picurls: "",
					province: ""
				}
			}
		},
		onLoad() {
			getProvince().then(res => {
				this.artObj.province = res;
			})
		},
		methods: {
			// 离开富文本编辑器焦点
			onFocus() {
				this.toolShow = true;
			},
			// 初始化
			onEditReady() {
				/**
				 * 获取节点dom
				 * uni.createSelectorQuery()创建查询器对象
				 * in(component)指向指定组件(dom)
				 * fields查询该节点哪些属性(size是尺寸,context是上下文(也就是它自身))
				 * fields接收两个参数, 第一个是对象,上面写了;第二个是初始化的回调
				 */
				uni.createSelectorQuery().in(this).select(".myEdit").fields({
					size: true,
					context: true
				}, res => {
					console.log(res);
					// 将获取到的 dom上下文 绑定到当前组件上, 以便下面进行富文本操作
					this.editorCtx = res.context;
				}).exec();
			},
			// 添加分割线
			clickDivider() {
				// this.editorCtx需要在富文本编辑器初始化的时候获取
				// 点击 添加分割线图标 事件, 给指定的富文本编辑器上, 添加个分割线
				this.editorCtx.insertDivider();
			},
			// 添加标题
			clickHead() {
				this.headShow = !this.headShow;
				// 给文字设置标题样式
				this.editorCtx.format("header", this.headShow ? 'H2' : false);
			},
			// 字体加粗
			clickBold() {
				this.boldShow = !this.boldShow;
				// 给文字设置加粗样式
				this.editorCtx.format("bold");
			},
			// 添加图像
			clickInsertImage() {
				// 选择图片
				uni.chooseImage({
					success: async (res) => {
						// mask是加载全屏遮罩,避免上传中用户进行别的操作
						uni.showLoading({
							title: "上传中,请稍后",
							mask: true
						});
						// console.log(res);
						// res.tempFiles是数组, 里面是本地选择的多张图片对象, 包含了本地路径、文件名称等信息
						for (let item of res.tempFiles) {
							// 上传图片
							let res = await uniCloud.uploadFile({
								filePath: item.path, // 文件本地路径
								cloudPath: item.name, // 文件名称 
							});

							// 富文本编辑器对象中插入上传云端成功的图片
							this.editorCtx.insertImage({
								src: res.fileID
							})
						}

						uni.hideLoading();
					}
				})
			},
			checkStatus(name, detail, obj) {
				if (detail.hasOwnProperty(name)) {
					this[obj] = true;
				} else {
					this[obj] = false;
				}
			},
			// 当样式发生改变的时候
			onStatusChange(e) {
				console.log(e.detail);
				let detail = e.detail;

				this.checkStatus("header", detail, "headShow");
				this.checkStatus("bold", detail, "boldShow");
			},
			// 提交表单
			onSubmit() {
				this.editorCtx.getContents({
					success: res => {
						console.log(res);
						this.artObj.description = res.text.slice(0, 80); // 摘取content中纯文本前80个字符内容作为摘要
						this.artObj.content = res.html; // content直接就是富文本的html
						this.artObj.picurls = getImgSrc(res.html); // 这里使用工具类, 正则匹配出content中所有url,也就是

						console.log(this.artObj);

						uni.showLoading({
							title: "发布中..."
						});

						// 添加数据
						this.addData();
					}
				})
			},
			addData() {

				db.collection("quanzi_article").add({
					...this.artObj
				}).then(res => {
					console.log(res);

					uni.showToast({
						title: "发布成功",
						icon: "success"
					});

					uni.reLaunch({
						url: "/pages/index/index"
					})
				}).catch(e => {
					uni.showToast({
						title: "发布失败",
						icon: "error"
					});
				})
				uni.hideLoading();
			}
		}
	}
</script>

<style lang="scss">
	/deep/ .ql-blank::before {
		font-style: normal;
		color: #e0e0e0;
	}

	.edit {
		padding: 30rpx;

		.title {
			input {
				height: 120rpx;
				font-size: 46rpx;
				border-bottom: 1px solid #e4e4e4;
				margin-bottom: 30rpx;
				color: #000;
			}

			.placeholderClass {
				color: #e0e0e0;
			}
		}

		.content {
			.myEdit {
				height: calc(100vh - 500rpx);
				margin-bottom: 30rpx;
			}
		}

		.tools {
			width: 100%;
			height: 80rpx;
			background: #fff;
			border-top: 1rpx solid #f4f4f4;
			position: fixed;
			left: 0;
			bottom: 0;
			display: flex;
			justify-content: space-around;
			align-items: center;

			.iconfont {
				font-size: 36rpx;
				color: #333;

				&.active {
					color: #0199FE
				}
			}
		}
	}
</style>